package com.mzy.basics.aop.common.aspect;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;

/**
 * @author Ives
 * * @date 2022/1/14
 */
public class qiemian {
//  /**
//   * <p>Title:防重复提交切面</p>
//   * <p>Description:</p>
//   *
//   * @author Allen
//   * @version 1.0
//   * @date 2020/04/21 17:52
//   */
//  @Aspect
//  @Component
//  @Slf4j
//  public class RepeatSubmitAspect {
//
//    @Autowired
//    private RedisLockService redisLockService;
//
//    @Pointcut("@annotation(noRepeatSubmit)")
//    public void pointCut(NoRepeatSubmit noRepeatSubmit) {
//
//    }
//
//    @Around("pointCut(noRepeatSubmit)")
//    public Object around(ProceedingJoinPoint pjp,NoRepeatSubmit noRepeatSubmit) throws Throwable {
//      int lockSeconds = noRepeatSubmit.lockTime();
//      HttpServletRequest request = getRequest();
//      Assert.notNull(request, " ====== request can not null ====== ");
//
//      String ip = getIpAddr(request);
//      String path = request.getServletPath();
//      String lockKey = ip + ":" +path;
//
//      boolean isSuccess = redisLockService.obtainDistributedLock(lockKey, lockSeconds, false);
//      log.info(" ====== tryLock lockKey = [{}] ======", lockKey);
//
//      if (isSuccess) {
//        log.info(" ====== tryLock success, lockKey = [{}] ====== ", lockKey);
//        // 获取锁成功
//        Object result;
//        try {
//          // 执行进程
//          result = pjp.proceed();
//        } finally {
//          // 解锁
//          if (redisLockService.releaseDistributedLock(lockKey)) {
//            log.info(" ====== releaseLock success, lockKey = [{}] ====== ", lockKey);
//          }
//        }
//        return result;
//      } else {
//        // 获取锁失败，认为是重复提交的请求
//        log.info(" ====== tryLock fail, lockKey = [{}]  ====== ", lockKey);
//        if(LanguageType.ZH_TW.equals(ReqEnvContext.getLanguageType())) {
//          CommonErrorEnum.REPEAT_SUBMIT_TW.fail();
//        }else {
//          CommonErrorEnum.REPEAT_SUBMIT_EN.fail();
//        }
//        return null;
//      }
//    }
//
//    private HttpServletRequest getRequest() {
//      ServletRequestAttributes ra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//      return ra.getRequest();
//    }
//
//    /**
//     * 获取访问者IP
//     * 在一般情况下使用Request.getRemoteAddr()即可，但是经过nginx等反向代理软件后，这个方法会失效。
//     * 本方法先从Header中获取X-Real-IP，如果不存在再从X-Forwarded-For获得第一个IP(用,分割)，
//     * 如果还不存在则调用Request .getRemoteAddr()。
//     *
//     * @param request
//     * @return
//     */
//    private String getIpAddr(HttpServletRequest request) {
//      String ip = request.getHeader("X-Real-IP");
//      if (!StringUtils.isEmpty(ip) && !"unknown".equalsIgnoreCase(ip)) {
//        if (ip.contains("../") || ip.contains("..\\")) {
//          return "";
//        }
//        return ip;
//      }
//      ip = request.getHeader("X-Forwarded-For");
//      if (!StringUtils.isEmpty(ip) && !"unknown".equalsIgnoreCase(ip)) {
//        // 多次反向代理后会有多个IP值，第一个为真实IP。
//        int index = ip.indexOf(',');
//        if (index != -1) {
//          ip = ip.substring(0, index);
//        }
//        if (ip.contains("../") || ip.contains("..\\")) {
//          return "";
//        }
//        return ip;
//      } else {
//        ip = request.getRemoteAddr();
//        if (ip.contains("../") || ip.contains("..\\")) {
//          return "";
//        }
//        if (ip.equals("0:0:0:0:0:0:0:1")) {
//          ip = "127.0.0.1";
//        }
//        return ip;
//      }
//
//    }
//  }
}
